/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.mindbox.mueblesalpes.negocio.persistence;

import com.mindbox.mueblesalpes.negocio.entity.Entidad;
import com.mindbox.mueblesalpes.negocio.entity.FormaPago;
import com.mindbox.mueblesalpes.negocio.entity.Mueble;
import com.mindbox.mueblesalpes.negocio.producto.IProductoService;
import com.mindbox.mueblesalpes.negocio.utilidades.UtilidadesEntidad;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author jsanchez
 */
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class ListadoProductosBean implements ListadoProductosLocal {

    @EJB
    private IProductoService producto;

    @PersistenceContext
    private EntityManager em;

    @Override
    public List<Mueble> obtenerProductosParaLaVenta(){
        return producto.consultarMuebles();
    }

    @Override
    public List<Entidad> getEntidadesBancarias() {
        return getEntidades(FormaPago.ENTIDAD_BANCARIA);
    }

    @Override
    public List<Entidad> getEntidadesTarjetaCredito() {
        return getEntidadesFromNamedQuery(FormaPago.TARJETA_CREDITO);
    }

    @Override
    public List<FormaPago> getFormasPago(){
        ArrayList<FormaPago> formasPago = new ArrayList<FormaPago>();
        for(FormaPago forma : FormaPago.values())
            formasPago.add(forma);
        return formasPago;
    }

    @Override
    public List<Entidad> getEntidadesTarjetaCreditoAlpes() {
        return getEntidades(FormaPago.TARJETA_CREDITO_ALPES);
    }

    /**
     * Obtiene las entidad desde el NamedQuery de la clase Entidad.
     * @param formaPago
     * @return
     */
    private List<Entidad> getEntidadesFromNamedQuery(FormaPago formaPago){
        Query query = em.createNamedQuery("findEntidadByFormaPago");
        query.setParameter("forma", formaPago);
        List listaEntidades = query.getResultList();
        if(listaEntidades.isEmpty()){
            List<Entidad> listEntity = UtilidadesEntidad.generarEntidades(formaPago);
            guardarEntidad(listEntity);
            return getEntidadesFromNamedQuery(formaPago);
        }
        return listaEntidades;
    }

    /**
     * Obtiene las entidades dado una forma de pago.
     * @param formaPago
     * @return
     */
    private List<Entidad> getEntidades(FormaPago formaPago){
        List<Entidad> entidades = new ArrayList<Entidad>();
        try {

            String txtQuery = "SELECT e FROM Entidad e where e.formaPago = "+FormaPago.class.getName()+"."+formaPago.name();
            Query query = em.createQuery(txtQuery);
            List listaEntidades = query.getResultList();
            if(listaEntidades.isEmpty()){
                List<Entidad> listEntity = UtilidadesEntidad.generarEntidades(formaPago);
                guardarEntidad(listEntity);
                return getEntidades(formaPago);
            }
            for (Entidad entidad : (List<Entidad>) listaEntidades) {
                entidades.add((Entidad) entidad.clone());
            }
        } catch (CloneNotSupportedException ex) {
            Logger.getLogger(ListadoProductosBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        return entidades;
    }

    /**
     * Guardar entidades.
     * @param entidades
     */
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    private void guardarEntidad(List<Entidad> entidades){
        try{
            for(Entidad entidad : entidades)
                em.persist(entidad);
        }catch(Exception e){
            // Si sale algún error no se propaga, solo se atrapa.
            // Porque si sale, es porque fue por llave primaria.
        }
    }
}